/**
 * 截断小数点两位后数字
 */
export const commonSubStr = (value) => {
	value = value + ""
    if(value !=''&& value.substr(0,1) == '.'){
        return value="";
    }
    value = value.replace(/^0*(0\.|[1-9])/, '$1');//解决 粘贴不生效
    value = value.replace(/[^\d.]/g,"");  //清除“数字”和“.”以外的字符
    value = value.replace(/\.{2,}/g,"."); //只保留第一个. 清除多余的     
    value = value.replace(".","$#$").replace(/\./g,"").replace("$#$",".");    
    value = value.replace(/^(\-)*(\d+)\.(\d\d).*$/,'$1$2.$3');//只能输入两个小数     
    if(value.indexOf(".")< 0 && value !=""){//以上已经过滤，此处控制的是如果没有小数点，首位不能为类似于 01、02的金额
        if(value.substr(0,1) == '0' && value.length == 2){
          value= value.substr(1,value.length);	
        }
    }
    return value
}

/* 
 *---------------  DateAdd(interval,number,date)  ----------------- 
 *  DateAdd(interval,number,date)  
 *  功能:实现日期加减 
 *  参数:interval,字符串表达式，表示要添加的时间间隔. y:年 q：季度 m:月 w:星期 d:天 h小时
 *  参数:number,数值表达式，表示要添加的时间间隔的个数. 
 *  参数:date,时间对象. 
 *  参数:code,加减标识. 加：add  减：reduce或不传
 *  返回:新的时间对象. 
 *  var  now  =  new  Date(); 
 *  var  newDate  =  DateAdd( "d ",5,now); 加5天
 *---------------  DateAdd(interval,number,date)  ----------------- 
 */
export const DateAdd =(interval, number, time, code) => {
  let date =  new  Date(time);
  switch(interval){ 
    // 年
    case  "y"  :  {
      if(code == 'add') {
        date.setFullYear(date.getFullYear()+number * 1); 
      } else {
        date.setFullYear(date.getFullYear()-number * 1); 
      }
      return  date; 
      break; 
    } 
    // 季度
    case  "q"  :  { 
      if(code == 'add') {
        date.setMonth(date.getMonth()+number*3); 
      } else {
        date.setMonth(date.getMonth()-number*3); 
      }
      return  date;
      break; 
    } 
    // 月
    case  "m"  :  { 
      
      if(code == 'add') {
        date.setMonth(date.getMonth()+number * 1);
      } else {
        date.setMonth(date.getMonth()-number * 1);
      }
      return  date; 
      break; 
    } 
    // 星期
    case  "w"  :  { 
      if(code == 'add') {
        date.setDate(date.getDate()+number*7);
      } else {
        date.setDate(date.getDate()-number*7);
      }
      return  date; 
      break; 
    }
    // 天
    case  "d"  :  { 
      if(code == 'add') {
        date.setDate(date.getDate()+number * 1); 
      } else {
        date.setDate(date.getDate()-number * 1); 
      }
      return  date;
      break; 
    } 
    //小时
    case  "h" :{ 
      if(code == 'add') {
        date.setHours(date.getHours()+number * 1);
      } else {
        date.setHours(date.getHours()-number * 1);
      }
      return  date;
      break; 
    } 
    //分 
    case  "m"  :  { 
      if(code == 'add') {
        date.setMinutes(date.getMinutes()+number * 1); 
      } else {
        date.setMinutes(date.getMinutes()-number * 1); 
      }
      return  date;
      break; 
    } 
    //秒 
    case  "s"  :  { 
      if(code == 'add') {
        date.setSeconds(date.getSeconds() + number * 1); 
      } else {
        date.setSeconds(date.getSeconds() - number * 1); 
      }
      return  date;
      break; 
    } 
    default  :  { 
      //不加
      return  date;
      break; 
    } 
  } 
}

/**
 * 获取当前日期：yyyy-MM-dd 比如 2019-01-02
 */
export const _getNowDate = () => {
    let time = new Date();
    let year = time.getFullYear();
    let month = time.getMonth() + 1 + '';
    let data = time.getDate() + '';
    if (month.length < 2) {
        month = '0' + month;
    }
    if (data.length < 2) {
        data = "0" + data
    }
    let newtime = year + "-" + month + "-" + data;
    return newtime
}

/**
 * 转换日期格式
 * 2018-01-02 或 时间戳 或 newdate ----》 20180102 或 2018/01/02 或 2018~01~02 或 2018-01-02
 * @param format可以为 / ~ '' - 等字符或字符串
 */
export const transDate = (value, format) => {
    if (!value) {
        return ''
    }
    if (!format) {
      format = ''
    }
    let time = new Date(value);
    let year = time.getFullYear();
    let month = time.getMonth() + 1 + '';
    let data = time.getDate() + '';
    if (month.length < 2) {
        month = '0' + month;
    }
    if (data.length < 2) {
        data = "0" + data
    }
    let newtime = year + `${format}` + month + `${format}` + data;
    return newtime;
}

/**
 * 校验空格  前后空格  全空格非法   中间空格不非法
 * @param {*} value 
 * true 有空格
 * false 没有
 */
export const checkSpaceStr = (value) => {
  if (value === undefined || value === null || value === '') {
    return true;
  }
  // trime后  长度和以前的不一样  非法
  if (value.length !== value.trim().length) {
    return true;
  }
  return false;
};

/**
 * 校验是否是正整数
 * @param {*} value 
 * return true 是正整数
 * return false 不是
 */
export const positiveInterger = (value) => {
  if (COMMON_REGEXP.positiveInt.test(value)) {
    return true;
  }
  return false;
}

/**
 * 校验非法字符
 * @param {*} value
 * return true 是
 * return false 不是
 */
export const checkSpecialCharacterStr = (value) => {
  if (!COMMON_REGEXP.specialCharacters.test(value)) {
    return true;
  }
  return false;
}

/**
 * 判断对象是否为空
 * @param {*} obj 对象
 * @return true 空对象  false 不是空对象
 */
export const isNotObject = (obj) => {
  var name;
  for (name in obj) {
    return false;
  }
  return true;
}

/**
 * 获取当前日期时间戳
 * 和传入日期转换时间戳
 */
export const  TimesTamp= (time) => {
  var date = new Date(time);
  var timestamp = date.getTime();
  return timestamp;
}

/**
 * 获取当前日期：x年x月x日
 */
export const getNowDate = () => {
    let time = new Date();
    let year = time.getFullYear();
    let month = time.getMonth() + 1 + '';
    let data = time.getDate() + '';
    if (month.length < 2) {
        month = '0' + month;
    }
    if (data.length < 2) {
        data = "0" + data
    }
    let newtime = year + "年" + month + "月" + data + "日";
    return newtime
}
/**
 * 获取当前日期：x-x-x
 */
export const _getNowDate = () => {
    let time = new Date();
    let year = time.getFullYear();
    let month = time.getMonth() + 1 + '';
    let data = time.getDate() + '';
    if (month.length < 2) {
        month = '0' + month;
    }
    if (data.length < 2) {
        data = "0" + data
    }
    let newtime = year + "-" + month + "-" + data;
    return newtime
}
/**
 * 获取日期格式：x年x月
 */
export const getYearMonth = (value) => {
    let year = value.getFullYear();
    let month = value.getMonth() + 1 + '';
    if (month.length < 2) {
        month = '0' + month;
    }
    let newtime = year + "年" + month + "月";
    return newtime
}

/**
 * 一层对象克隆：等同于Object.assign({},obj)
 */
export const cloneObj = obj => {
    let newObj = JSON.parse(JSON.stringify(obj));
    return newObj
}

/**
 * 邮政编码校验
 * 返回值: true/false
 */
export const postCodeCheck = value => {
    let reg = /^[0-9]{6}$/;
    let result = reg.test(value);
    return result
}

/**
 * 手机号码校验
 * 返回值: true/false
 */
export const mobileCheck = value => {
    let reg = /^1[3|4|5|7|8][0-9]{9}$/;
    let result = reg.test(value);
    return result
}

/**
 * 电话号码校验
 * 返回值: true/false
 */
export const telephoneCheck = value => {
    let reg = /^0\d{2,3}-?\d{7,8}$/;
    let result = reg.test(value);
    return result
}

/**
 * 网址校验
 * 返回值: true/false
 */
export const urlCheck = value => {
    let str = `^((https|http|ftp|rtsp|mms)?://)`
        + `?(([0-9a-z_!~*'().&=+$%-]+:)?[0-9a-z_!~*'().&=+$%-]+@)?`//ftp的user@
        + `?(([0-9]{1,3}\.){3}[0-9]{1,3}`//IP形式的url
        + `|`//允许IP和DOMAIN
        + `([0-9a-z_!~*'()-]+\.)*`//域名-www
        + `([0-9a-z][0-9a-z]{0,61})?[0-9a-z]\.`//二级域名
        + `[a-z]{2,6})`//first level domain-.com or .museum
        + `(:[0-9]{1,4})?`//端口-:80
        + `((/?)|`// a slash isn't required if there is na file name
        + `(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$`;
    let reg = new RegExp(str);
    let result = reg.test(value);
    return result
}

/**
 * 传真号码校验
 * 返回值: true/false
 */
export const faxCheck = value => {
    let reg = /^(\d{3,4})?[-]?\d{7,8}$/;
    let result = reg.test(value);
    return result
}

/**
 * 邮箱校验
 * 返回值: true/false
 */
export const emailCheck = value => {
    let reg = /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/;
    let result = reg.test(value);
    return result
}

/**
 * (1,2)位整数，(1,2)位小数：可参考自行添加对应整数位和小数位的校验
 * 返回值: true/false
 */
export const twoPoinTwo = value => {
    var reg = /^[0-9]{0,2}(\.[0-9]{0,2})?$/;
    var reg1 = /^[0-9]{0,16}$/
    let result = !((!reg.test(value)) && (!reg1.test(value)));
    return result
}

/**
 * 保留4位小数的数字：可参考自行添加对应小数位的校验
 * 返回值: true/false
 */
export const decimalNumFour = value => {
    let reg = /^[+|-]{0,1}[0-9]{0,20}(\.[0-9]{0,4})?$/;
    let result = reg.test(value);
    return result
}
//保留两位小数
export const decimalNumTwo = value => {
    let reg = /^[+|-]{0,1}[0-9]{0,20}(\.[0-9]{0,2})?$/;
    let result = reg.test(value);
    return result
}
/**
 * 不要特殊符号
 * 返回值: true/false
 */
export const specialSymbol = value => {
    let reg = /^[A-Za-z0-9|\u4e00-\u9fa5|\.|\:|\：]+$/;
    let result = reg.test(value || null);
    return result
}

/**
 * 身份证号校验
 * 返回值: true/false
 */
export const checkCard = value => {
    let reg = /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
    let result = reg.test(value);
    return result
}

/**
 * 姓名中间不能有空格
 * 返回值: true/false
 */
export const checkName = value => {
    var reg = /^[\u4E00-\u9FA5]{1,6}$/;
    let result = reg.test(value);
    return result
}

/**
 * 检验纯数字
 * 返回值: true/false
 */
export const checkNumber = value => {
    var reg = /^[0-9]*$/;
    let result = reg.test(value);
    return result
}
/**
 * 检验纯数字(包含小数点)
 * 返回值: true/false
 */
export const checkDotNumber = value => {
    var reg = /([1-9]\d*\.?\d*)|(0\.\d*[1-9])/;
    let result = reg.test(value);
    return result
}
/**
 * 检验纯汉字
 * 返回值: true/false
 */
export const checkChinese = value => {
    var reg = /.*[\u4e00-\u9fa5]+.*$/;
    let result = reg.test(value);
    return result
}

/**
 * 检验英文和数字
 * 返回值: true/false
 */
export const checkEnAndNum = value => {
    var reg = /^[A-Za-z0-9]+$/;
    let result = reg.test(value || null);
    return result
}

/**
 * 检验正数
 * 返回值: true/false
 */
export const checkZnum = value => {
    var reg = /^[+]{0,1}(\d+)$|^[+]{0,1}(\d+\.\d+)$/;
    let result = reg.test(value);
    return result
}

/**
 * 检验正整数(不包括小数)
 * 返回值: true/false
 */
export const checkZzNum = value => {
    var reg = /^[1-9]\d*$/;
    let result = reg.test(value);
    return result
}

/**
 * 仅支持英文
 * 返回值: true/false
 */
export const checkEn = value => {
    var reg = /^[A-Za-z0-9\_]+$/;
    let result = reg.test(value || null);
    return result
}

/**
 * 汉字--不能超过20个字符(可自行拓展)
 * 返回值: true/false
 */
export const checkChineseLenMax = value => {
    var reg = /^[\u4e00-\u9fa5]{0,20}$/;
    let result = reg.test(value);
    return result
}

/**
 * 汉字--不能低于20个字符(可自行拓展)
 * 返回值: true/false
 */
export const checkChineseLenMin = value => {
    var reg = /^[\u4e00-\u9fa5]{20,}$/;
    let result = reg.test(value);
    return result
}

//深复制方法
export const deepclone = (obj) => {
    var c = obj instanceof Array ? [] : {};
    for (var i in obj) if (obj.hasOwnProperty(i)) {
        var prop = obj[i];
        if (typeof prop == 'object') {
            if (prop instanceof Array) {
                c[i] = [];
                for (var j = 0; j < prop.length; j++) {
                    if (typeof prop[j] != 'object') {
                        c[i].push(prop[j]);
                    } else {
                        c[i].push(deepclone(prop[j]));
                    }
                }
            } else {
                c[i] = deepclone(prop);
            }
        } else {
            c[i] = prop;
        }
    }
    return c;
}


// 判断页面按钮是否应激活,btnJudge为按钮激活条件,status为按钮的状态
export const setBtnActive = (btnJudge) => {
    var status;
    if (btnJudge) {
        status = false;
    } else {
        status = true;
    }
    return status;
}

//时间转时间戳
export const  timestamp= (time) => {
    var date = new Date(time);
    var timestamp = date.getTime();
    return timestamp;
}

 // 数字转大写
 export const  chineseCapitals= (n) => {
    var fraction = ['角', '分'];
    var digit = [
      '零', '壹', '贰', '叁', '肆',
      '伍', '陆', '柒', '捌', '玖'
    ];
    var unit = [
      ['元', '万', '亿'],
      ['', '拾', '佰', '仟']
    ];
    var head = n < 0 ? '欠' : '';
    n = Math.abs(n);
    var s = '';
    for (var i = 0; i < fraction.length; i++) {
      s += (digit[Math.floor(n * 10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, '');
    }
    s = s || '整';
    n = Math.floor(n);
    for (var i = 0; i < unit[0].length && n > 0; i++) {
      var p = '';
      for (var j = 0; j < unit[1].length && n > 0; j++) {
        p = digit[n % 10] + unit[1][j] + p;
        n = Math.floor(n / 10);
      }
      s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s;
    }
    n = head + s.replace(/(零.)*零元/, '元')
      .replace(/(零.)+/g, '零')
      .replace(/^整$/, '零元整');
    return head + s.replace(/(零.)*零元/, '元')
      .replace(/(零.)+/g, '零')
      .replace(/^整$/, '零元整');
  }
  
  // 转货币加逗号格式并保留两位小数
  export const  formatCurrency = (num) => {
    var reg = /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/;
    if(num === 0 || num == "0"){
      return num = '0.00';
    }
    if (num) {
      num = num.toString();
      //如果num有‘+’或者‘-’，则获取它的符号
      var sign,unit;
      if (num.indexOf("+") > -1) {
        sign = '+';
        num = num.substring(1, num.length);
      } else if (num.indexOf("-") > -1) {
        sign = '-';
        num = num.substring(1, num.length);
      } else {
        sign = '';
      }
      //将num中的$,去掉，将num变成一个纯粹的数据格式字符串,四舍五入
      num = parseFloat(num).toFixed(2).toString().replace(/\$|\,/g,'');
	  // 不四舍五入
	  // num = parseFloat(num).toString().match(/^\d+(?:\.\d{0,2})/);
      //如果num有单位'元'，则获取它的单位
      if (num.indexOf("元") === num.length - 1 ) {
        unit = '元';
        num = num.substring(1, num.length-1);
      } else {
        unit = '';
      }
      if (reg.test(num)){
        //如果存在小数点，则获取数字的小数部分
        var cents = num.indexOf(".")> 0 ? num.substr(num.indexOf(".")) : '';
        cents = cents.length >1 ? cents : '' ;//注意：这里如果是使用change方法不断的调用，小数是输入不了的
        //获取数字的整数数部分
        num = num.indexOf(".")>0 ? num.substring(0,(num.indexOf("."))) : num ;
        //针对整数部分进行格式化处理，这是此方法的核心，也是稍难理解的一个地方，逆向的来思考或者采用简单的事例来实现就容易多了
        /*
          也可以这样想象，现在有一串数字字符串在你面前，如果让你给他家千分位的逗号的话，你是怎么来思考和操作的?
          字符串长度为0/1/2/3时都不用添加
          字符串长度大于3的时候，从右往左数，有三位字符就加一个逗号，然后继续往前数，直到不到往前数少于三位字符为止
          */
        for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
        {
            num = num.substring(0,num.length-(4*i+3))+','+num.substring(num.length-(4*i+3));
        }
        //将数据（符号、整数部分、小数部分、单位）整体组合返回
        return (sign + num + cents + unit);    
      } else {
        Toast('请输入正确的金额');
        return '';
      }
    }
  }


//银行卡4位1个空格
export const bankStyle = (bankNo) => {
	let styleBank;  //格式化后的银行卡号

	if(bankNo){
		let acctBankNo= bankNo.split('-')[0];   //主账号
		let acctNo= bankNo.split('-')[1] ? `-${bankNo.split('-')[1]}` : '';     //下挂编号
		let styleGroup = acctBankNo.length < 4 ? '' : acctBankNo.match(/\d{4}/g).join(' ');     //主账号隔4位分组
		let remainderLen = acctBankNo.length % 4;       //主账号除4剩余的位数
		styleBank = remainderLen === 0 ?
		 `${styleGroup}${acctNo}` :
		 `${styleGroup}${styleGroup ? ' ' : ''}${acctBankNo.substr(-remainderLen)}${acctNo}`;
	}else{
		styleBank = '';
	}

	return styleBank;
}

//银行卡去除空格
export const clearSpace = (val) => {
	let bankNo = val.replace(/\s+/g,"");     
	return bankNo;  
}

/**
 * 两个时间段相差的天数
 * sDate1和sDate2是2006-12-18格式
 */
export const datedifference = (sDate1, sDate2) => {   
  var dateSpan,
      tempDate,
      iDays;
  sDate1 = Date.parse(sDate1);
  sDate2 = Date.parse(sDate2);
  dateSpan = sDate2 - sDate1;
  dateSpan = Math.abs(dateSpan);
  iDays = Math.floor(dateSpan / (24 * 3600 * 1000));
  return iDays
};

 /**
  * 转换日期格式 yyyymmdd 转化 yyyy-mm-dd
  * @param value yyyymmdd
  */
export const timeFormat = (value) =>{
  if (!value) {
      return '';
  }
  let dateString = value.toString();
  let pattern = /(\d{4})(\d{2})(\d{2})/;
  let formatedDate = dateString.replace(pattern, '$1-$2-$3');
  return formatedDate;
}
/**
  * 码值翻译扩展，同时翻译多个码值
  * @param value 码值表的value
  * @param args 码值表
  * @param char 可穿参数， 分隔符
  * 例如[{label: '正常', value: '1'},{label: '失败', value: '2'}]
  * return 正常
  * 例如2[{label: '正常', value: '1'},{label: '失败', value: '2'}]
  * return 正常，失败
  * angular写法： {{需要翻译的码值 | codeValueTranslation: 翻译数组: '分隔符，比如 ，'}}
  */
function codeValueTranslation(values: any, args: any[], char: string): any{
	let value = [];
	const retValue = [];
	if (args) {
		value = !char ? [values] : (values && values.indexOf(char) > -1 ? values.split(char) : [values]);
		value.map(str => {
			args.forEach(item => {
				if (item.value === str) {
					retValue.push(item.label);
				}
			})
		});
		return retValue.join(char || '');
	}
}

/**
* 查询日期是周几
* 入参： 20190625
* 出参：周二
*/
function getDay(date): any{
	var d=new Date(date);
	var weekday=new Array(7);
	weekday[0]="周日";
	weekday[1]="周一";
	weekday[2]="周二";
	weekday[3]="周三";
	weekday[4]="周四";
	weekday[5]="周五";
	weekday[6]="周六";
	return weekday[d.getDay()];
}



/**
  * 数字每三位用逗号隔开
  * @param value 
  */
function format_number(n){
	var b=parseInt(n).toString();
	var len=b.length;
	if(len<=3){return b;}
	var r=len%3;
	return r>0?b.slice(0,r)+","+b.slice(r,len).match(/\d{3}/g).join(","):b.slice(r,len).match(/\d{3}/g).join(",");
}

/**
 * 只能输入中英文校验
 * 返回值: true/false
 */
export const isChineseAndEnglish = value => {
    let reg = /^[\u0391-\uFFE5A-Za-z]+$/;
    let result = reg.test(value);
    return result
}

// 增加天 
function AddDays(date,value) { 
	date.setDate(date.getDate()+value); 
}
// 增加月 
function AddMonths(date,value) { 
	date.setMonth(date.getMonth()+value); 
}
// 增加年 
function AddYears(date,value){ 
	date.setFullYear(date.getFullYear()+value); 
}
// 是否为今天 
function IsToday(date) { 
	return IsDateEquals(date,new Date()); 
}
// 是否为当月 
function IsThisMonth(date) { 
	return IsMonthEquals(date,new Date()); 
}
// 两个日期的年是否相等 
function IsMonthEquals(date1,date2) { 
	return date1.getMonth()==date2.getMonth()&&date1.getFullYear()==date2.getFullYear(); 
}
// 判断日期是否相等 
function IsDateEquals(date1,date2) { 
	return date1.getDate()==date2.getDate()&&IsMonthEquals(date1,date2); 
} （jquery中文网 www.jquerycn.cn 编辑整理）
// 返回某个日期对应的月份的天数 
function GetMonthDayCount(date) { 
	switch(date.getMonth()+1) { 
	case 1:case 3:case 5:case 7:case 8:case 10:case 12: 
	return 31; 
	case 4:case 6:case 9:case 11: 
	return 30; 
} 
//feb: 
date=new Date(date); 
var lastd=28; 
date.setDate(29); 
while(date.getMonth()==1) 
{ 
lastd++; 
AddDays(date,1); 
} 
return lastd; 
}
// 返回两位数的年份 
function GetHarfYear(date) 
{ 
var v=date.getYear(); 
if(v>9)return v.toString(); 
return "0"+v; 
}
// 返回月份（修正为两位数） 
function GetFullMonth(date) 
{ 
var v=date.getMonth()+1; 
if(v>9)return v.toString(); 
return "0"+v; 
}
// 返回日 （修正为两位数） 
function GetFullDate(date) 
{ 
var v=date.getDate(); 
if(v>9)return v.toString(); 
return "0"+v; 
}
// 替换字符串 
function Replace(str,from,to) 
{ 
return str.split(from).join(to); 
}
// 格式化日期的表示 
function FormatDate(date,str) 
{ 
str=Replace(str,"yyyy",date.getFullYear()); 
str=Replace(str,"MM",GetFullMonth(date)); 
str=Replace(str,"dd",GetFullDate(date)); 
str=Replace(str,"yy",GetHarfYear(date)); 
str=Replace(str,"M",date.getMonth()+1); 
str=Replace(str,"d",date.getDate()); 
return str; 
}
// 统一日期格式 
function ConvertDate(str) 
{ 
str=(str+"").replace(/^\s*/g,"").replace(/\s*$/g,""); // 去除前后的空白 
var d; 
if(/^[0-9]{8}$/.test(str)) // 20040226 -> 2004-02-26 
{ 
d=new Date(new Number(str.substr(0,4)),new Number(str.substr(4,2))-1,new Number(str.substr(6,2))); 
if(d.getTime())return d; 
} 
d=new Date(str); 
if(d.getTime())return d; 
d=new Date(Replace(str,"-","/")); 
if(d.getTime())return d; 
return null; 
}  
js时间差函数 
<SCRIPT LANGUAGE=javascript> 
alert(addDay(-30,1)); 
alert(addDay(-30,2)); 
alert(addDay(-30,3)); 
alert(addDay(-30,0));
function addDay(days,n) 
{ 
//函数说明：days日期差，n代表如下含义。 
var my_date_ago=new Date(new Date() - days * 24 * 60 * 60 * 1000 * -1);//days天的日期 
switch (n) 
{ 
case 1: 
//返回年 
return(my_date_ago.getFullYear()); 
break; 
case 2: 
//返回月 
return(my_date_ago.getMonth()+1); 
break; 
case 3: 
//返回日 
return(my_date_ago.getDate()); 
break; 
default : 
//返回全部 
return(my_date_ago.getFullYear() + "-" + (my_date_ago.getMonth()+1) + "-" + my_date_ago.getDate()); 
break; 
} 
}

// 最简单数组去重法
/*
* 新建一新数组，遍历传入数组，值不在新数组就push进该新数组中
* IE8以下不支持数组的indexOf方法
* */
function uniq(array){
    var temp = []; //一个新的临时数组
    for(var i = 0; i < array.length; i++){
        if(temp.indexOf(array[i]) == -1){
            temp.push(array[i]);
        }
    }
    return temp;
}

var aa = [1,2,2,4,9,6,7,5,2,3,5,6,5];
console.log(uniq(aa));

/*
* 速度最快， 占空间最多（空间换时间）
*
* 该方法执行的速度比其他任何方法都快， 就是占用的内存大一些。
* 现思路：新建一js对象以及新数组，遍历传入数组时，判断值是否为js对象的键，
* 不是的话给对象新增该键并放入新数组。
* 注意点：判断是否为js对象键时，会自动对传入的键执行“toString()”，
* 不同的键可能会被误认为一样，例如n[val]-- n[1]、n["1"]；
* 解决上述问题还是得调用“indexOf”。*/
function uniq(array){
    var temp = {}, r = [], len = array.length, val, type;
    for (var i = 0; i < len; i++) {
        val = array[i];
        type = typeof val;
        if (!temp[val]) {
            temp[val] = [type];
            r.push(val);
        } else if (temp[val].indexOf(type) < 0) {
            temp[val].push(type);
            r.push(val);
        }
    }
    return r;
}

var aa = [1,2,"2",4,9,"a","a",2,3,5,6,5];
console.log(uniq(aa));

/*
* 给传入数组排序，排序后相同值相邻，
* 然后遍历时,新数组只加入不与前一值重复的值。
* 会打乱原来数组的顺序
* */
function uniq(array){
    array.sort();
    var temp=[array[0]];
    for(var i = 1; i < array.length; i++){
        if( array[i] !== temp[temp.length-1]){
            temp.push(array[i]);
        }
    }
    return temp;
}

var aa = [1,2,"2",4,9,"a","a",2,3,5,6,5];
console.log(uniq(aa));

/*
*
* 还是得调用“indexOf”性能跟方法1差不多，
* 实现思路：如果当前数组的第i项在当前数组中第一次出现的位置不是i，
* 那么表示第i项是重复的，忽略掉。否则存入结果数组。
* */
function uniq(array){
    var temp = [];
    for(var i = 0; i < array.length; i++) {
        //如果当前数组的第i项在当前数组中第一次出现的位置是i，才存入数组；否则代表是重复的
        if(array.indexOf(array[i]) == i){
            temp.push(array[i])
        }
    }
    return temp;
}

var aa = [1,2,"2",4,9,"a","a",2,3,5,6,5];
console.log(uniq(aa));

// 思路：获取没重复的最右一值放入新数组
/*
* 推荐的方法
*
* 方法的实现代码相当酷炫，
* 实现思路：获取没重复的最右一值放入新数组。
* （检测到有重复值时终止当前循环同时进入顶层循环的下一轮判断）*/
function uniq(array){
    var temp = [];
    var index = [];
    var l = array.length;
    for(var i = 0; i < l; i++) {
        for(var j = i + 1; j < l; j++){
            if (array[i] === array[j]){
                i++;
                j = i;
            }
        }
        temp.push(array[i]);
        index.push(i);
    }
    console.log(index);
    return temp;
}

var aa = [1,2,2,3,5,3,6,5];
console.log(uniq(aa));